home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / components / flockBlogsomeService.js < prev    next >
Text File  |  2007-10-12  |  21KB  |  619 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16. //
  17.  
  18. const ENABLE_DEBUG = true; // switch to turn off slow debug code for production
  19. function DEBUG(x) { if (ENABLE_DEBUG) debug("flockBlogsomeService: "+x+"\n"); }
  20.  
  21. const Cc = Components.classes;
  22. const Ci = Components.interfaces;
  23.  
  24. const BLOGSOME_CID = Components.ID('{c36e232f-9a3e-4848-b9a8-d7a880a7544f}');
  25. const BLOGSOME_CONTRACTID = '@flock.com/service/blogsome;1';
  26.  
  27. const BLOGSOME_FAVICON = 'http://www.blogsome.com/favicon.ico';
  28. const SERVICE_ENABLED_PREF          = "flock.service.blogsome.enabled";
  29. const CATEGORY_COMPONENT_NAME       = "Blogsome JS Component"
  30. const CATEGORY_ENTRY_NAME           = "blogsome"
  31.  
  32. const RDFS = Cc['@mozilla.org/rdf/rdf-service;1'].getService (Ci.nsIRDFService);
  33.  
  34. var gCompTK;
  35. function getCompTK() {
  36.   if (!gCompTK) {
  37.     gCompTK = Components.classes["@flock.com/singleton;1"]
  38.                         .getService(Components.interfaces.flockISingleton)
  39.                         .getSingleton("chrome://browser/content/flock/services/common/load-compTK.js")
  40.                         .wrappedJSObject;
  41.   }
  42.   return gCompTK;
  43. }
  44.  
  45. function loadSubScript(spec) {
  46.   var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  47.   var context = {};
  48.   loader.loadSubScript(spec, context);
  49.   return context;
  50. }
  51.  
  52. var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  53.  
  54. loader.loadSubScript('chrome://browser/content/utilityOverlay.js');
  55. loader.loadSubScript("chrome://browser/content/flock/xmlrpc/xmlrpchelper.js");
  56. loader.loadSubScript("chrome://browser/content/flock/blog/blogBackendLib.js");
  57.  
  58.  
  59. function userBlogsListener(aListener){
  60.   this.listener = aListener;
  61. }
  62.  
  63. userBlogsListener.prototype =
  64. {
  65.   // aResult is an Array (simpleEnumerator) of struct objects
  66.   onResult: function(aResult) {
  67.     var result = new Array();
  68.     for (i=0; i<aResult.length; i++){
  69.       var entry = aResult[i];
  70.       var newAccount = new BlogAccount(entry.blogName);
  71.       newAccount.blogid = entry.blogid;
  72.       newAccount.apiLink = "";
  73.       newAccount.URL = entry.url;
  74.       result.push(newAccount);
  75.     }
  76.     this.listener.onResult(new simpleEnumerator(result));
  77.   },
  78.   onError: function(errorcode, errormsg) {
  79.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  80.     error.serviceErrorCode = errorcode;
  81.     error.serviceErrorString = errormsg;
  82.     // Stupid server doesn't return any correct XML, but just a plain text error message
  83.     if (errorcode.match("blog doesn't exist")) {
  84.       error.serviceErrorString = errorcode;
  85.       error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  86.     }
  87.     else
  88.       error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  89.     this.listener.onError(error);
  90.   },
  91.   onFault: function(errorcode, errormsg) {
  92.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  93.     error.serviceErrorCode = errorcode;
  94.     error.serviceErrorString = errormsg;
  95.     switch (errorcode) {
  96.       case 403: // Invalid login/pass
  97.         error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  98.         break;
  99.       default: // Unknown error code
  100.         error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  101.     }
  102.     this.listener.onFault(error);
  103.   }
  104. }
  105.  
  106.  
  107. function flockBSService () {
  108.   var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  109.   obs.addObserver(this, 'xpcom-shutdown', false);
  110.   this.status = Ci.flockIWebService.STATUS_UNKNOWN;
  111.   this.initialized = false;
  112.  
  113.   this._ctk = {
  114.     interfaces: [
  115.       "nsISupports",
  116.       "nsIClassInfo",
  117.       "nsIObserver",
  118.       "nsISupportsCString",
  119.       "flockIWebService",
  120.       "flockIAuthenticateNewAccount",
  121.       "flockIManageableWebService",
  122.       "flockIBlogWebService"
  123.     ],
  124.     shortName: "blogsome",
  125.     fullName: "Blogsome",
  126.     description: "Blogsome Web Service",
  127.     favicon: BLOGSOME_FAVICON,
  128.     CID: BLOGSOME_CID,
  129.     contractID: BLOGSOME_CONTRACTID,
  130.     accountClass: flockBSAccount
  131.   };
  132.   this._profiler = Cc["@flock.com/profiler;1"].getService(Ci.flockIProfiler);
  133.  
  134.   this.init();
  135. }
  136.  
  137. // nsIObserver
  138. flockBSService.prototype.observe = function flockBSService_observe(subject, topic, state) {
  139.   switch (topic) {
  140.     case 'xpcom-shutdown':
  141.       var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  142.       obs.removeObserver(this, 'xpcom-shutdown');
  143.       return;
  144.   }
  145. }
  146.  
  147. // flockIWebService implementation
  148. flockBSService.prototype.addAccount =
  149. function flockBSService_addAccount(aUsername, aPassword, aListener)
  150. {
  151.   //DEBUG("{flockIWebService}.addAccount('"+aUsername+"', 'XXXXXXXX', ...)");
  152.   //DEBUG(" THIS FUNCTION IS DEPRECATED AND SHOULD BE REPLACED WITH A CALL TO addAccountById() !");
  153.   return this.addAccountById(aUsername, true, aListener);
  154. }
  155.  
  156. flockBSService.prototype.addAccountById =
  157. function flockBSService_addAccountById(aUsername, aIsTransient, aListener)
  158. {
  159.   var accountURN = this.urn+":"+aUsername;
  160.   var account = new this.faves_coop.Account(accountURN, {
  161.     name: aUsername,
  162.     serviceId: BLOGSOME_CONTRACTID,
  163.     service: this.bsService,
  164.     accountId: aUsername,
  165.     isPollable : false,
  166.     isTransient: aIsTransient,
  167.     favicon: this.icon,
  168.     URL: this.url,
  169.     showInSidebar: false
  170.   });
  171.   this.faves_coop.accounts_root.children.addOnce(account);
  172.   // this.USER = blAccount.id();
  173.   // var acct = this.getAccount(blAccount.id());
  174.   this.USER = accountURN;
  175.  
  176.   // Add the blog account
  177.   var wpsvc = this;
  178.   var listener = {
  179.     onResult: function(aResult) {
  180.       var theBlog;
  181.       while (aResult.hasMoreElements()) {
  182.         theBlog = aResult.getNext();
  183.         theBlog.QueryInterface(Ci.flockIBlogAccount);
  184.         theCoopBlog = new wpsvc.faves_coop.Blog(accountURN+":"+theBlog.blogid, {
  185.           name: theBlog.title,
  186.           title: theBlog.title,
  187.           blogid: theBlog.blogid,
  188.           URL: theBlog.URL,
  189.           apiLink: theBlog.URL+'xmlrpc.php'
  190.         });
  191.         account.children.addOnce(theCoopBlog);
  192.  
  193.         // Comments: create the "My Blogs" folder if needed
  194.         var feedManager = Components.classes["@flock.com/feed-manager;1"].getService(Components.interfaces.flockIFeedManager);
  195.         var blogFolder = null;
  196.         var _enum = feedManager.getFeedContext("news").getRoot().getChildren();
  197.         while (_enum.hasMoreElements() && !blogFolder) {
  198.           var candidate = _enum.getNext();
  199.           if (candidate.getTitle() == "My Blogs")
  200.             blogFolder = candidate;
  201.         }
  202.         if (!blogFolder)
  203.           blogFolder = feedManager.getFeedContext("news").getRoot().addFolder("My Blogs");
  204.         // Comments: add the stream
  205.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  206.         var uri = ios.newURI(theBlog.URL+"comments/feed/", null, null);
  207.         var feedManagerListener = {
  208.           onGetFeedComplete: function(feed) {
  209.             blogFolder.subscribeFeed(feed);
  210.           },
  211.           onError: function(error) {
  212.           }
  213.         }
  214.         feedManager.getFeed(uri, feedManagerListener);
  215.       }
  216.       if (aListener) aListener.onSuccess(acct, "addAccount");
  217.     },
  218.     onFault: function(aError) {
  219.       debug("flockBlogsomeService: fault in addAccount: "+aError);
  220.       wpsvc.faves_coop.accounts_root.children.remove(account);
  221.       account.destroy();
  222.       if(aListener) {
  223.         aListener.onError(null, 'FAULT', aError);
  224.       }
  225.     },
  226.     onError: function(aError) {
  227.       debug("flockBlogsomeService: error in addAccount: "+aError);
  228.       wpsvc.faves_coop.accounts_root.children.remove(account);
  229.       account.destroy();
  230.       if(aListener) {
  231.         aListener.onError(null, 'ERROR', aError);
  232.       }
  233.     }
  234.   };
  235.  
  236.   var apiLink = 'http://'+aUsername+'.blogsome.com/xmlrpc.php';
  237.   this.getUsersBlogs(listener, apiLink);
  238.  
  239.   var acct = this.getAccount(accountURN);
  240.   return acct;
  241. }
  242.  
  243.  
  244. flockBSService.prototype.removeAccount =
  245. function(aUrn)
  246. {
  247.   this.acUtils.removeAccount(aUrn);
  248. }
  249.  
  250.  
  251. flockBSService.prototype.getAccount =
  252. function(aUrn)
  253. {
  254.   this.logger.info("{flockIWebService}.getAccount('"+aUrn+"')");
  255.   var acctCoop = this.faves_coop.get(aUrn);
  256.   var acct = new flockBSAccount();
  257.   acct.urn = aUrn;
  258.   acct.username = acctCoop.username;
  259.   return acct;
  260. }
  261.  
  262.  
  263. flockBSService.prototype.init =
  264. function ()
  265. {
  266.   DEBUG(".init()");
  267.  
  268.   if (this.initialized) return;
  269.   this.initialized = true;
  270.  
  271.   var evtID = this._profiler.profileEventStart("blogsome-init");
  272.  
  273.   this.prefService = Components.classes["@mozilla.org/preferences-service;1"]
  274.                                .getService(Components.interfaces.nsIPrefBranch);
  275.   if ( this.prefService.getPrefType(SERVICE_ENABLED_PREF) &&
  276.        !this.prefService.getBoolPref(SERVICE_ENABLED_PREF) )
  277.   {
  278.     DEBUG("Pref "+SERVICE_ENABLED_PREF+" set to FALSE... not initializing.");
  279.     var catMgr = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
  280.     catMgr.deleteCategoryEntry("wsm-startup", CATEGORY_COMPONENT_NAME, true);
  281.     catMgr.deleteCategoryEntry("flockWebService", CATEGORY_ENTRY_NAME, true);
  282.     return;
  283.   }
  284.  
  285.   // Logger
  286.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  287.   this.logger.init("blogsome");
  288.  
  289.   // Attributes of flockIBlogWebService
  290.   this.supportsCategories = 2;
  291.   this.supportsPostReplace = true;
  292.   this.metadataOverlay = "";
  293.  
  294.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  295.  
  296.   this.faves_coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
  297.     this.account_root = this.faves_coop.accounts_root;
  298.  
  299.     this.bsService = new this.faves_coop.Service('urn:blogsome:service');
  300.   this.bsService.name = 'blogsome';
  301.   this.bsService.desc = 'The Blogsome.com Service';
  302.   this.bsService.logoutOption = false;
  303.   this.bsService.domains = "blogsome.com";
  304.   this.bsService.serviceId = BLOGSOME_CONTRACTID;
  305.  
  306.   this.urn = this.bsService.id();
  307.   this.url = "http://www.blogsome.com";
  308.  
  309.   this.webDetective = this.acUtils.useWebDetective("blogsome.xml");
  310.  
  311.   this._profiler.profileEventEnd(evtID, "");
  312. }
  313.  
  314.  
  315. flockBSService.prototype.refresh =
  316. function flockBSService_refresh(aURN, aListener)
  317. {
  318.     debug ("flockBSService refresh with aURN of " + aURN + "\n");
  319.  
  320.     // Introspection against what we're syncing - Identity or Account or Item?
  321.     var refreshItem = this.faves_coop.get(aURN);
  322.  
  323.   if (refreshItem instanceof this.faves_coop.Account) {
  324.     }
  325.   else if (refreshItem instanceof this.faves_coop.Favorite) {
  326.     }
  327.   else {
  328.         throw Components.results.NS_ERROR_ABORT;
  329.     }
  330. }
  331.  
  332. flockBSService.prototype.refreshAccount =
  333. function flockBSService_refreshAccount (aURN, aListener) {
  334.   debug("WPService - refreshAccount with aURN of " + aURN);
  335. }
  336.  
  337.  
  338. // BEGIN flockIBlogWebService interface
  339.  
  340.  
  341. flockBSService.prototype.newPost =
  342. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  343. {
  344.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  345.   mtService.newPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  346. }
  347.  
  348. flockBSService.prototype.editPost =
  349. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  350. {
  351.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  352.   mtService.editPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  353. }
  354.  
  355. flockBSService.prototype.deletePost =
  356. function(aListener, aBlogId, aPostid)
  357. {
  358.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  359.   mtService.deletePost(aListener, aBlogId, aPostid);
  360. }
  361.  
  362. flockBSService.prototype.getUsersBlogs =
  363. function(aListener, aUrl)
  364. {
  365.   var username = this.faves_coop.get(this.USER).name;
  366.   debug("USER: "+username+"\n");
  367.   var pw = this.acUtils.getPassword(this.urn+':'+username);
  368.   debug(" ^^^^^^^^^ Get the password for "+this.urn+':'+username+"\n");
  369.  
  370.   var listener = new userBlogsListener(aListener, false);
  371.   var xmlrpcServer = new flockXmlRpcServer (aUrl);
  372.   var args = ["flockbrowser", username, pw.password];
  373.   xmlrpcServer.call("blogger.getUsersBlogs", args, listener);
  374. }
  375.  
  376. flockBSService.prototype.getRecentPosts =
  377. function(aListener, aBlogId, aNumber)
  378. {
  379.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  380.   mtService.getRecentPosts(aListener, aBlogId, aNumber);
  381. }
  382.  
  383. flockBSService.prototype.getCategoryList =
  384. function(aListener, aBlogId)
  385. {
  386.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  387.   mtService.getCategoryList(aListener, aBlogId);
  388. }
  389.  
  390. // END flockIBlogWebService interface
  391.  
  392. // BEGIN flockIManageableWebService interface
  393. flockBSService.prototype.docRepresentsSuccessfulLogin =
  394. function flockBSService_docRepresentsSuccessfulLogin(aDocument)
  395. {
  396.   this.logger.debug("{flockIManageableWebService}.docRepresentsSuccessfulLogin(aDocument)");
  397.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  398.   return this.webDetective.detect("blogsome", "loggedin", aDocument, null);
  399. }
  400.  
  401. flockBSService.prototype.getAccountIDFromDocument =
  402. function flockBSService_getAccountIDFromDocument(aDocument)
  403. {
  404.   this.logger.debug("{flockIManageableWebService}.getAccountIDFromDocument(aDocument)");
  405.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  406.  
  407.   // The URL is the form http://<username>.blogsome.com
  408.   var ios = Components.classes["@mozilla.org/network/io-service;1"]
  409.                       .getService(Components.interfaces.nsIIOService);
  410.   var uri = ios.newURI(aDocument.URL, null, null);
  411.   return uri.host.split(".")[0];
  412. }
  413.  
  414. flockBSService.prototype.ownsDocument =
  415. function flockBSService_ownsDocument(aDocument)
  416. {
  417.   this.logger.debug("{flockIManageableWebService}.ownsDocument(aDocument)");
  418.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  419.   var ios = Components.classes["@mozilla.org/network/io-service;1"]
  420.                       .getService(Components.interfaces.nsIIOService);
  421.   var uri = ios.newURI(aDocument.URL, null, null);
  422.   if ((uri.host == "blogsome.com") || (uri.host.indexOf(".blogsome.com") > 0)) {
  423.     return true;
  424.   }
  425.   else {
  426.     return false;
  427.   }
  428. }
  429.  
  430. flockBSService.prototype.updateAccountStatusFromDocument =
  431. function flockBSService_updateAccountStatusFromDocument(aDocument)
  432. {
  433.   this.logger.debug("{flockIManageableWebService}.updateAccountStatusFromDocument(aDocument)");
  434.   if (this.ownsDocument(aDocument)) {
  435.     if (this.docRepresentsSuccessfulLogin(aDocument)) {
  436.       var accountID = this.getAccountIDFromDocument(aDocument);
  437.       var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
  438.       var accounts = this.faves_coop.Account.find({serviceId: BLOGSOME_CONTRACTID});
  439.       for (var i = 0; i < accounts.length; i++) {
  440.         if (accounts[i].id() == acctURN) {
  441.           accounts[i].isAuthenticated = true;
  442.         } else {
  443.           accounts[i].isAuthenticated = false;
  444.         }
  445.       }
  446.     } else {
  447.       var login = aDocument.getElementById("Login");
  448.       if (login) {
  449.         this.acUtils.markAllAccountsAsLoggedOut(BLOGSOME_CONTRACTID);
  450.       }
  451.     }
  452.   }
  453. }
  454.  
  455. flockBSService.prototype.logout =
  456. function flockBSService_logout()
  457. {
  458.   this.logger.debug("{flockIManageableWebService}.logout()");
  459.   var cookieManager = Cc["@mozilla.org/cookiemanager;1"]
  460.                       .getService(Ci.nsICookieManager);
  461.   var allCookies = cookieManager.enumerator;
  462.   while (allCookies.hasMoreElements()) {
  463.     var cookie = allCookies.getNext()
  464.                            .QueryInterface(Ci.nsICookie);
  465.     if (cookie.host.match("blogsome.com")) {
  466.       cookieManager.remove(cookie.host, cookie.name, cookie.path, false);
  467.     }
  468.   }
  469. }
  470. // END flockIManageableWebService interface
  471.  
  472.  
  473. // ================================================
  474. // ========== BEGIN XPCOM Module support ==========
  475. // ================================================
  476.  
  477. function createModule(aParams) {
  478.   var Cc = Components.classes;
  479.   var Ci = Components.interfaces;
  480.   var Cr = Components.results;
  481.   return {
  482.     registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
  483.       aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  484.       aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
  485.                                         aParams.contractID, aFileSpec,
  486.                                         aLocation, aType );
  487.       var catMgr = Cc["@mozilla.org/categorymanager;1"]
  488.         .getService(Ci.nsICategoryManager);
  489.       if (!aParams.categories) { aParams.categories = []; }
  490.       for (var i = 0; i < aParams.categories.length; i++) {
  491.         var cat = aParams.categories[i];
  492.         catMgr.addCategoryEntry( cat.category, cat.entry,
  493.                                  cat.value, true, true );
  494.       }
  495.     },
  496.     getClassObject: function (aCompMgr, aCID, aIID) {
  497.       if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
  498.       if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
  499.       return { // Factory
  500.         createInstance: function (aOuter, aIID) {
  501.           if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
  502.           var comp = new aParams.componentClass();
  503.           if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
  504.           return comp.QueryInterface(aIID);
  505.         }
  506.       };
  507.     },
  508.     canUnload: function (aCompMgr) { return true; }
  509.   };
  510. }
  511.  
  512. // NS Module entrypoint
  513. function NSGetModule(aCompMgr, aFileSpec) {
  514.   return createModule({
  515.     componentClass: flockBSService,
  516.     CID: BLOGSOME_CID,
  517.     contractID: BLOGSOME_CONTRACTID,
  518.     componentName: CATEGORY_COMPONENT_NAME,
  519.     implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
  520.     categories: [ // "flock-startup" is automagically added
  521.       { category: "wsm-startup", entry: CATEGORY_COMPONENT_NAME, value: BLOGSOME_CONTRACTID },
  522.       { category: "flockWebService", entry: CATEGORY_ENTRY_NAME, value: BLOGSOME_CONTRACTID }
  523.     ]
  524.   });
  525. }
  526.  
  527. // ========== END XPCOM Module support ==========
  528.  
  529.  
  530.  
  531.  
  532. /* ********** Account Class ********** */
  533.  
  534. function flockBSAccount() {
  535.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  536.   this.logger.init("blogsomeAccount");
  537.  
  538.   this.faves_coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
  539.  
  540.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  541.  
  542.   this.service = Cc[BLOGSOME_CONTRACTID].getService(Ci.flockIBlogWebService)
  543. }
  544.  
  545. // nsISupports implementation
  546. flockBSAccount.prototype.QueryInterface = function(iid) {
  547.   if (!iid.equals(Ci.nsISupports) &&
  548.     !iid.equals(Ci.flockIWebServiceAccount) &&
  549.     !iid.equals(Ci.flockIBlogWebServiceAccount))
  550.   {
  551.     throw Components.results.NS_ERROR_NO_INTERFACE;
  552.   }
  553.   return this;
  554. }
  555.  
  556. // flockIWebServiceAccount implementation
  557. flockBSAccount.prototype.login = function(listener) {
  558.   this.logger.info("{flockIWebServiceAccount}.login()");
  559.   if (listener) {
  560.     listener.onSuccess(this, "login");
  561.   }
  562. }
  563. flockBSAccount.prototype.logout = function(listener) {
  564.   this.logger.info("{flockIWebServiceAccount}.logout()");
  565.   var c_acct = this.faves_coop.get(this.urn);
  566.   if (c_acct.isAuthenticated) {
  567.     c_acct.isAuthenticated = false;
  568.     var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
  569.                                   .getService(Components.interfaces.nsICookieManager);
  570.     var allCookies = cookieManager.enumerator;
  571.     var cookieHost = c_acct.accountId+".blogsome.com";
  572.     while (allCookies.hasMoreElements()) {
  573.       var cookie = allCookies.getNext()
  574.                              .QueryInterface(Components.interfaces.nsICookie);
  575.       if (cookie.host == cookieHost) {
  576.         cookieManager.remove(cookieHost, cookie.name, cookie.path, false);
  577.       }
  578.     }
  579.   }
  580.   if (listener) {
  581.     listener.onSuccess(this, "logout");
  582.   }
  583. }
  584. flockBSAccount.prototype.activate = function(aListener) {
  585.   this.logger.info("{flockIWebServiceAccount}.activate()");
  586. }
  587. flockBSAccount.prototype.deactivate = function() {
  588.   this.logger.info("{flockIWebServiceAccount}.deactivate()");
  589. }
  590. flockBSAccount.prototype.keep = function() {
  591.   var c_acct = this.faves_coop.get(this.urn);
  592.   c_acct.isTransient = false;
  593.   this.acUtils.makeTempPasswordPermanent(this.service.urn+':'+c_acct.accountId);
  594. }
  595. flockBSAccount.prototype.remove = function() {
  596.   this.service.removeAccount(this.urn);
  597. }
  598.  
  599. // flockIBlogWebServiceAccount implementation
  600. flockBSAccount.prototype.getBlogs = function() {
  601.   this.logger.info("{flockIBlogWebServiceAccount}.getBlogs()");
  602.   var blogsEnum = {
  603.     QueryInterface : function(iid) {
  604.       if (!iid.equals(Ci.nsISupports) &&
  605.           !iid.equals(Ci.nsISimpleEnumerator))
  606.       {
  607.         throw Components.results.NS_ERROR_NO_INTERFACE;
  608.       }
  609.       return this;
  610.     },
  611.     hasMoreElements : function() {
  612.       return false;
  613.     },
  614.     getNext : function() {
  615.     }
  616.   };
  617.   return blogsEnum;
  618. }
  619.